/*
task: 栈模拟解决ac151
author: 李智铭 3022206093
*/
#include <iostream>
#include <cmath>
#include <stack>
#include <string>
using namespace std;

string str;
stack<int> nums; // 用于存储数字的栈
stack<char> ops; // 用于存储运算符的栈

//函数声明
void process();
void calculate();
void evaluate(string);

// 处理表达式，确保括号配对，并在必要时为负号添加前导0
void process(){
    // 如果表达式以负号开头，添加一个 '0' 作为起始
    if (str[0] == '-') str = '0' + str;
    
    // 在表达式开头和结尾分别添加括号，以确保计算顺序
    str = '(' + str + ')';

    int lcount = 0, rcount = 0; // 左右括号计数器
    // 统计左括号和右括号的数量
    for (char ch : str) {
        if (ch == '(') lcount++;
        if (ch == ')') rcount++;
    }

    // 添加额外的左括号以平衡
    while (lcount < rcount) {
        str = '(' + str;
        lcount++;
    }
    // 添加额外的右括号以平衡
    while (rcount < lcount) {
        str += ')';
        rcount++;
    }
}

// 执行一次运算，并将运算结果压入数字栈
void calculate() {
    // 检查栈的状态，防止空栈操作
    if (nums.size() < 2 || ops.empty()) return;

    // 从数字栈中弹出两个数字
    int a = nums.top(); nums.pop();
    int b = nums.top(); nums.pop();
    
    // 从运算符栈中弹出一个运算符
    char op = ops.top(); ops.pop();

    int res = 0; // 计算结果初始化
    // 根据运算符进行相应的运算
    if (op == '+') res = b + a;
    else if (op == '-') res = b - a;
    else if (op == '*') res = b * a;
    else if (op == '/') res = b / a;
    else if (op == '^') res = pow(b, a);

    // 将运算结果压入数字栈
    nums.push(res);
}

// 解析表达式字符串并计算
void evaluate(string s){
    for (int i = 0; i < s.length(); ++i) {
        // 处理数字
        if (isdigit(s[i])) {
            int j = i, t = 0;
            // 读取多位数
            while (j < s.length() && isdigit(s[j])) {
                t = t * 10 + (s[j] - '0');
                j++;
            }
            nums.push(t); // 将数字压入数字栈
            i = j - 1; // 更新索引
        } else {
            char c = s[i];
            // 处理左括号
            if (c == '(') ops.push(c);
            // 处理加号和减号
            else if (c == '+' || c == '-') {
                // 处理负号
                if (c == '-' && i > 0 && !(isdigit(s[i - 1]) || s[i - 1] == ')')) {
                    if (s[i + 1] == '(') {
                        // 将负号替换为 (-1) * 的形式
                        nums.push(-1);
                        ops.push('*');
                    } else {
                        int j = i + 1, t = 0;
                        // 读取多位负数
                        while (j < s.length() && isdigit(s[j])) {
                            t = t * 10 + (s[j] - '0');
                            j++;
                        }
                        nums.push(-t);
                        i = j - 1;
                    }
                } else {
                    // 执行栈中优先级较高的运算
                    while (ops.top() != '(') calculate();
                    ops.push(c);
                }
            }
            // 处理乘除运算
            else if (c == '*' || c == '/') {
                // 处理高优先级的运算
                while (!ops.empty() && (ops.top() == '*' || ops.top() == '/' || ops.top() == '^')) calculate();
                ops.push(c);
            }
            // 处理幂运算
            else if (c == '^') {
                while (!ops.empty() && ops.top() == '^') calculate();
                ops.push(c);
            }
            // 处理右括号
            else if (c == ')') {
                // 将括号内的表达式全部计算完
                while (ops.top() != '(') calculate();
                ops.pop(); // 弹出左括号
            }
        }
    }

    // 处理剩余运算符
    while (!ops.empty()) calculate();
}

int main(){
    // 输入表达式字符串
    cin >> str;
    process(); // 预处理表达式
    evaluate(str); // 解析并计算表达式
    // 输出最终结果
    cout << nums.top() << endl;
    return 0;
}